package com.bs.utils.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**********************************************************
 * 文件名称：LogUtil.java 
 * 摘    要：
 *
 * 初始版本：1.0.0.0
 * 原 作 者：叶平平
 * 完成日期：2015-4-10 上午11:27:39
 * 
 ************************************************************/
/**********************************************************
//第一种使用方法（效率低）
LogUtil.debug("我是一条debug消息");

//第二种使用方法
LogUtil.debug(log, "我是一条debug消息 {} {}", "参数1", "参数2");

RuntimeException e = new RuntimeException("错误");

//第一种使用方法（效率低）
LogUtil.error("我是一条error消息");

//第二种使用方法
LogUtil.error(log, e, "<-异常对象放前面, 我是一条带参数的error消息 {} {}", "参数1", "参数2");

private static Logger log = LogUtil.get();

Logger.xxx(log, "消息");
 * 
 ************************************************************/
public class LogUtil {

	/**
	* @描述:<p>获得Logger </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:29:11
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param clazz 日志发出的类
	*  @return
	*/
	public static Logger get(Class<?> clazz) {
		return LoggerFactory.getLogger(clazz);
	}
	
	/**
	* @描述:<p>获得Logger </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:31:33
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param name	自定义的日志发出者名称
	*  @return
	*/
	public static Logger get(String name) {
		return LoggerFactory.getLogger(name);
	}
	
	/**
	* @描述:<p> 获得日志，自动判定日志发出者</p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:32:08
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @return
	*/
	public static Logger get() {
		StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
		return LoggerFactory.getLogger(stackTrace[2].getClassName());
	}
	
	/**
	* @描述:<p>Trace等级日志，小于debug 
	* 	由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	* 	</p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:32:40
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void trace(String format, Object... arguments) {
		trace(innerGet(), format, arguments);
	}
	
	/**
	* @描述:<p> Trace等级日志，小于Debug</p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:34:19
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param log		日志对象
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void trace(Logger log, String format, Object... arguments) {
		log.trace(format, arguments);
	}
	
	/**
	* @描述:<p>Debug等级日志，小于Info 
	* 		由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	* </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:35:22
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void debug(String format, Object... arguments) {
		debug(innerGet(), format, arguments);
	}
	
	/**
	* @描述:<p>Debug等级日志，小于Info </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:36:13
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param log		日志对象
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void debug(Logger log, String format, Object... arguments) {
		log.debug(format, arguments);
	}
	
	/**
	* @描述:<p>Info等级日志，小于Warn 
	* 	由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	* </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:36:53
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	 变量对应的参数
	*/
	public static void info(String format, Object... arguments) {
		info(innerGet(), format, arguments);
	}
	
	/**
	* @描述:<p>Info等级日志，小于Warn </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:37:54
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param log		日志对象
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void info(Logger log, String format, Object... arguments) {
		log.info(format, arguments);
	}
	
	/**
	* @描述:<p>Warn等级日志，小于Error
	* 	由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	* </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:38:55
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void warn(String format, Object... arguments) {
		warn(innerGet(), format, arguments);
	}
	
	/**
	* @描述:<p> Warn等级日志，小于Error</p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:39:35
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param log		日志对象
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void warn(Logger log, String format, Object... arguments) {
		log.warn(format, arguments);
	}
	
	/**
	 * Warn等级日志，小于Error
	 * @param log 日志对象
	 * @param e 需在日志中堆栈打印的异常
	 * @param format 格式文本，{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void warn(Logger log, Throwable e, String format, Object... arguments) {
		log.warn(format(format, arguments), e);
	}
	
	/**
	* @描述:<p> Error等级日志
	 * 		由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	 * </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:40:20
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void error(String format, Object... arguments) {
		error(innerGet(), format, arguments);
	}
	
	/**
	* @描述:<p>Error等级日志 </p>
	*
	* @作者:  叶平平(yepp)
	*
	* @时间:  2015-4-10 上午11:41:07
	*
	* @修改历史: <p>修改时间、修改人、修改原因/说明</p>
	*
	*  @param log		日志对象
	*  @param format	格式文本，{} 代表变量
	*  @param arguments	变量对应的参数
	*/
	public static void error(Logger log, String format, Object... arguments) {
		log.error(format, arguments);
	}
	
	/**
	 * Error等级日志<br>
	 * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	 * @param e 需在日志中堆栈打印的异常
	 * @param format 格式文本，{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void error(Throwable e, String format, Object... arguments) {
		error(innerGet(), e, format(format, arguments));
	}
	
	/**
	 * Error等级日志<br>
	 * 由于动态获取Logger，效率较低，建议在非频繁调用的情况下使用！！
	 * @param log 日志对象
	 * @param e 需在日志中堆栈打印的异常
	 * @param format 格式文本，{} 代表变量
	 * @param arguments 变量对应的参数
	 */
	public static void error(Logger log, Throwable e, String format, Object... arguments) {
		log.error(format(format, arguments), e);
	}
	
	/**
	 * 格式化文本
	 * @param template 文本模板，被替换的部分用 {} 表示
	 * @param values 参数值
	 * @return 格式化后的文本
	 */
	private static String format(String template, Object... values) {
		return String.format(template.replace("{}", "%s"), values);
	}
	
	/**
	 * @return 获得日志，自动判定日志发出者
	 */
	private static Logger innerGet() {
		StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
		return LoggerFactory.getLogger(stackTrace[3].getClassName());
	}
}
